package 中等.动态规划.子序列;

/**
 * 给你一个整数数组 nums 。一个子数组 [numsl, numsl+1, ..., numsr-1, numsr] 的
 * 和的绝对值 为 abs(numsl + numsl+1 + ... + numsr-1 + numsr) 。
 * 请你找出 nums 中 和的绝对值 最大的任意子数组（可能为空），并返回该 最大值 。
 * abs(x) 定义如下：
 * 如果 x 是负整数，那么 abs(x) = -x 。
 * 如果 x 是非负整数，那么 abs(x) = x 。
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode.cn/problems/maximum-absolute-sum-of-any-subarray
 */
public class 任意子数组和的绝对值的最大值_1749 {

    public static void main(String[] args) {

    }

    /**
     * 动态规划
     * 1，子问题
     * 以 i 结尾的子数组最大绝对值和是多少
     * 2，状态转移方程
     * dp[i] = Math.max(以 i-1 结尾子数组的最大和+nums[i],以 i-1 结尾子数组的最小和+nums[i])
     */
    public int maxAbsoluteSum(int[] nums) {
        int maxAbs = 0;
        int preMaxSum = 0, preMinSum = 0;

        for (int num : nums) {
            maxAbs = Math.max(maxAbs, preMaxSum + num);
            maxAbs = Math.max(maxAbs, Math.abs(preMinSum + num));

            preMaxSum = Math.max(num, preMaxSum + num);
            preMinSum = Math.min(num, preMinSum + num);
        }

        return maxAbs;
    }

}
